package com.zmx.common.common.utils.Lock;//package com.zmx.common.common.utils.Lock;
//
//import com.google.common.base.Preconditions;
//import com.zmx.common.common.config.ZookeeperLockConfig;
//import lombok.extern.slf4j.Slf4j;
//import org.I0Itec.zkclient.ZkClient;
//import org.apache.commons.collections.CollectionUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//
//import java.util.HashMap;
//import java.util.HashSet;
//import java.util.Map;
//import java.util.Set;
//import java.util.concurrent.locks.Lock;
//
///**
// * @Description: zookeeper锁的抽象基类
// * @ClassName: ZookeeperLockParent
// * @Author zhaomxr
// * @Date 2021-10-20 13:54
// */
//@Slf4j
//public abstract class ZookeeperLockParent implements Lock {
//    /**
//     * 所有客户端连接
//     */
//    private Map<String, ZkClient> zkClientMap = new HashMap<String, ZkClient>();
//    /**
//     * zk客户端关联实例
//     */
//    private Map<ZkClient, Set<ZookeeperLockParent>> zkReference = new HashMap<ZkClient, Set<ZookeeperLockParent>>();
//    /**
//     * 初始化锁
//     */
//    private Object initLock = new Object();
//    /**
//     * zk客户端
//     */
//    private ZkClient zkClient;
//
//    @Autowired
//    private ZookeeperLockConfig zookeeperLockConfig;
//
//    public ZookeeperLockParent() {
//        init();
//    }
//
//    public ZookeeperLockParent(ZookeeperLockConfig config) {
//        checkConfig(config);
//        this.zookeeperLockConfig = config;
//        init();
//    }
//
//    /**
//     * 初始化
//     */
//    private void init(){
//        //双重检测
//        if (!zkClientMap.containsKey(zookeeperLockConfig.getZkAddress())) {
//            synchronized (initLock) {
//                if (!zkClientMap.containsKey(zookeeperLockConfig.getZkAddress())) {
//                    //zkClientMap如果没有，初始化zookeeper连接客户端
//                    String zkServers = zookeeperLockConfig.getZkAddress() + ":" + zookeeperLockConfig.getPort();
//                    int zkConnectTimeout = zookeeperLockConfig.getZkConnecctTimeout() != null ? zookeeperLockConfig.getZkConnecctTimeout() : Integer.MAX_VALUE;
//                    zkClient = new ZkClient(zkServers, zkConnectTimeout);
//                    zkClientMap.put(zookeeperLockConfig.getZkAddress(), zkClient);
//                    log.info("zookeeper zkClient init! zkServers:{} connectTimeOut:{}", zkServers, zkConnectTimeout);
//                }
//            }
//        }
//
//        //双重检测，zk客户端关联实例
//        if (!zkReference.containsKey(zkClient)) {
//            synchronized (initLock) {
//                if (!zkReference.containsKey(zkClient)) {
//                    zkReference.put(zkClient, new HashSet<ZookeeperLockParent>());
//                }
//            }
//        }
//        zkReference.get(zkClient).add(this);
//        zkClient = zkClientMap.get(zookeeperLockConfig.getZkAddress());
//    }
//
//    /**
//     * 检查zookeeper配置参数
//     * @param config
//     */
//    private void checkConfig(ZookeeperLockConfig config) {
//        Preconditions.checkNotNull(config, "zookeeper config is null");
//        Preconditions.checkArgument(StringUtils.isEmpty(config.getZkAddress()), "zookeeper address is null");
//        Preconditions.checkArgument(StringUtils.isEmpty(config.getPort() + ""), "zookeeper port is null");
//    }
//
//    /**
//     * 销毁当前zookeeper连接客户端，释放zkClientMap与 zkReference
//     */
//    private void destory() {
//        zkReference.get(zkClient).remove(this);
//        if (CollectionUtils.isEmpty(zkReference.get(zkClient))) {
//            synchronized (initLock) {
//                if (CollectionUtils.isEmpty(zkReference.get(zkClient))) {
//                    zkClientMap.remove(zookeeperLockConfig.getZkAddress());
//                    zkReference.remove(zkClient);
//                    zkClient.close();
//                    log.info("zookeeper zkClient close! zkServers:{}", zookeeperLockConfig.getZkAddress() + zookeeperLockConfig.getPort());
//                }
//            }
//        }
//    }
//
//
//    public Map<String, ZkClient> getZkClientMap() {
//        return zkClientMap;
//    }
//
//    public Map<ZkClient, Set<ZookeeperLockParent>> getZkReference() {
//        return zkReference;
//    }
//
//    public ZkClient getZkClient() {
//        return zkClient;
//    }
//
//    public ZookeeperLockConfig getZookeeperLockConfig() {
//        return zookeeperLockConfig;
//    }
//}
